From 9bf15c63f83c808ab7212cb88ba42a22526ac3dd Mon Sep 17 00:00:00 2001 From: tsteven4 <13596209+tsteven4@users.noreply.github.com> Date: Sun, 6 Aug 2023 17:23:24 -0600 Subject: [PATCH] fix interator invalidation issue with trackfilter segment option. (#1153) and add a test case that demonstrates the issue. --- reference/track/trackfilter_segment.csv | 45 +++++ reference/track/trackfilter_segment~csv.gpx | 175 ++++++++++++++++++++ testo.d/track.test | 3 + trackfilter.cc | 5 +- 4 files changed, 226 insertions(+), 2 deletions(-) create mode 100644 reference/track/trackfilter_segment.csv create mode 100644 reference/track/trackfilter_segment~csv.gpx diff --git a/reference/track/trackfilter_segment.csv b/reference/track/trackfilter_segment.csv new file mode 100644 index 000000000..87950e360 --- /dev/null +++ b/reference/track/trackfilter_segment.csv @@ -0,0 +1,45 @@ +No,UTM-Zone,UTM-Ch,UTM-East,UTM-North,Name,Date,Time +1,13,T,500000,4400000,Point01,2023-01-01,00:00:00 +2,13,T,500050,4400000,Point02,2023-01-01,00:00:10 +3,13,T,500100,4400000,Point03,2023-01-01,00:00:20 +4,13,T,500150,4400000,Point04,2023-01-01,00:00:30 +5,13,T,500200,4400000,Point05,2023-01-01,00:00:40 +6,13,T,500250,4400000,Point06,2023-01-01,00:00:50 +7,13,T,500300,4400000,Point07,2023-01-01,00:01:00 +8,13,T,500350,4400000,Point08,2023-01-01,00:01:10 +9,13,T,500400,4400000,Point09,2023-01-01,00:01:20 +10,13,T,500450,4400000,Point10,2023-01-01,00:01:30 +11,13,T,500450.2,4400000,Point11,2023-01-01,00:01:40 +12,13,T,500450.4,4400000,Point12,2023-01-01,00:01:50 +13,13,T,500450.6,4400000,Point13,2023-01-01,00:02:00 +14,13,T,500500,4400000,Point14,2023-01-01,00:02:10 +15,13,T,500550,4400000,Point15,2023-01-01,00:02:20 +16,13,T,500600,4400000,Point16,2023-01-01,00:02:30 +17,13,T,500650,4400000,Point17,2023-01-01,00:02:40 +18,13,T,500700,4400000,Point18,2023-01-01,00:02:50 +19,13,T,500750,4400000,Point19,2023-01-01,00:03:00 +20,13,T,500800,4400000,Point20,2023-01-01,00:03:10 +21,13,T,500850,4400000,Point21,2023-01-01,00:03:20 +22,13,T,500900,4400000,Point22,2023-01-01,00:03:30 +23,13,T,500950,4400000,Point23,2023-01-01,00:03:40 +24,13,T,510000,4400000,Point24,2023-01-01,01:00:00 +25,13,T,510050,4400000,Point25,2023-01-01,01:00:10 +26,13,T,510100,4400000,Point26,2023-01-01,01:00:20 +27,13,T,510150,4400000,Point27,2023-01-01,01:00:30 +28,13,T,510200,4400000,Point28,2023-01-01,01:00:40 +29,13,T,510250,4400000,Point29,2023-01-01,01:00:50 +30,13,T,510300,4400000,Point30,2023-01-01,01:01:00 +31,13,T,510350,4400000,Point31,2023-01-01,01:01:10 +32,13,T,510400,4400000,Point32,2023-01-01,01:01:20 +33,13,T,510450,4400000,Point33,2023-01-01,01:01:30 +34,13,T,510500,4400000,Point34,2023-01-01,01:01:40 +35,13,T,510550,4400000,Point35,2023-01-01,01:01:50 +36,13,T,510600,4400000,Point36,2023-01-01,01:02:00 +37,13,T,510650,4400000,Point37,2023-01-01,01:02:10 +38,13,T,510700,4400000,Point38,2023-01-01,01:02:20 +39,13,T,510750,4400000,Point39,2023-01-01,01:02:30 +40,13,T,510800,4400000,Point40,2023-01-01,01:02:40 +41,13,T,510850,4400000,Point41,2023-01-01,01:02:50 +42,13,T,510900,4400000,Point42,2023-01-01,01:03:00 +43,13,T,510950,4400000,Point43,2023-01-01,01:03:10 + diff --git a/reference/track/trackfilter_segment~csv.gpx b/reference/track/trackfilter_segment~csv.gpx new file mode 100644 index 000000000..8e3a90672 --- /dev/null +++ b/reference/track/trackfilter_segment~csv.gpx @@ -0,0 +1,175 @@ + + + + + + + + + Point01 + + + + Point02 + + + + Point03 + + + + Point04 + + + + Point05 + + + + Point06 + + + + Point07 + + + + Point08 + + + + Point09 + + + + Point10 + + + + Point13 + + + + Point14 + + + + Point15 + + + + Point16 + + + + Point17 + + + + Point18 + + + + Point19 + + + + Point20 + + + + Point21 + + + + Point22 + + + + Point23 + + + + + + Point24 + + + + Point25 + + + + Point26 + + + + Point27 + + + + Point28 + + + + Point29 + + + + Point30 + + + + Point31 + + + + Point32 + + + + Point33 + + + + Point34 + + + + Point35 + + + + Point36 + + + + Point37 + + + + Point38 + + + + Point39 + + + + Point40 + + + + Point41 + + + + Point42 + + + + Point43 + + + + diff --git a/testo.d/track.test b/testo.d/track.test index 299247e56..c925f5cc9 100644 --- a/testo.d/track.test +++ b/testo.d/track.test @@ -77,4 +77,7 @@ compare ${REFERENCE}/track/simint250m.csv ${TMPDIR}/simint250m_2.csv gpsbabel -t -i unicsv -f ${REFERENCE}/track/simint.csv -x track,faketime=f2022+1 -o unicsv,utc -F ${TMPDIR}/simint1000m.csv compare ${REFERENCE}/track/simint1000m.csv ${TMPDIR}/simint1000m.csv +# segment +gpsbabel -t -i unicsv,utc -f ${REFERENCE}/track/trackfilter_segment.csv -x track,segment -o gpx -F ${TMPDIR}/trackfilter_segment~csv.gpx +compare ${REFERENCE}/track/trackfilter_segment~csv.gpx ${TMPDIR}/trackfilter_segment~csv.gpx diff --git a/trackfilter.cc b/trackfilter.cc index 82022081e..77ec41aca 100644 --- a/trackfilter.cc +++ b/trackfilter.cc @@ -917,7 +917,8 @@ void TrackFilter::trackfilter_segment_head(const route_head* rte) // (Empirically determined; It's a few dozen feet.) const double ktoo_close = 0.000005; - for (auto it = rte->waypoint_list.cbegin(); it != rte->waypoint_list.cend(); ++it) { + const auto wptlist = rte->waypoint_list; // track_del_wpt will modify rte->waypoint_list + for (auto it = wptlist.cbegin(); it != wptlist.cend(); ++it) { auto* wpt = *it; if (index > 0) { double cur_dist = gcdist(RAD(prev_wpt->latitude), @@ -930,7 +931,7 @@ void TrackFilter::trackfilter_segment_head(const route_head* rte) } if (cur_dist < ktoo_close) { - if (wpt != rte->waypoint_list.back()) { + if (wpt != wptlist.back()) { auto* next_wpt = *std::next(it); if (trackfilter_points_are_same(prev_wpt, wpt) && trackfilter_points_are_same(wpt, next_wpt)) { -- 2.30.2